package concurrency.ping_pong;

import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

/*
 * PB : Le programme ne termine pas !! Il reste bloque...
 */
public class ExecutorPingPong {
	
	private int repetition;
	private static int cpt;
	
	public ExecutorPingPong(int repetition) {
		this.repetition = repetition;
		cpt = 0;
	}
	
	public void displayPingPong() {
		/*
		 * Executor est une liste d'attente bloquante d'ACTIONS a effectuer.
		 * Meme principe que l'EDT pour la gestion de l'IHM.
		 * Les ACTIONS (Runnable) sont executees de maniere ASYNCHRONE,
		 * mais on est assure qu'elles seront realisees dans l'ORDRE de leur ajout dans l'executor.
		 */
		Executor executor = Executors.newSingleThreadExecutor();
		for (int i = 0; i < repetition; i++) {
			executor.execute(new Ping());
			executor.execute(new Pong());
		}
	}
	
	private class Ping implements Runnable {
		@Override
		public void run() {
			System.out.print("" + ++cpt + " " + "Ping-");
		}
	}
	
	private class Pong implements Runnable {
		@Override
		public void run() {
			System.out.println("Pong");
		}
	}
	
	public static void main(String[] args) {
		ExecutorPingPong ex_ping_pong = new ExecutorPingPong(200);
		ex_ping_pong.displayPingPong();
		/*
		 * PB : Le programme ne termine pas !! Il reste bloque...
		 */
	}
}
